/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.ufc.quixada.adrs.comandos.admin;

import br.ufc.quixada.adrs.interfaces.Comando;
import br.ufc.quixada.adrs.model.Adrs;
import br.ufc.quixada.adrs.model.Prazo;
import br.ufc.quixada.adrs.service.AdrsService;
import br.ufc.quixada.adrs.service.PrazoService;
import br.ufc.quixada.adrs.util.UtilAdrs;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 *
 * @author Escritorio projetos
 */
public class CmdGerarPrazosAnuais implements Comando {

    public String executa(HttpServletRequest request, HttpServletResponse response) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy");
        Date dataAtual = new Date();
        String anoAtual = sdf.format(dataAtual);
        request.getSession().removeAttribute("gerarPrazos");

        PrazoService prazoService = new PrazoService();
        String diaIniciolQuantitativo = "01";
        String diaFimQuantitativo = "15";
        AdrsService adrsSevice = new AdrsService();
        List<Adrs> listaAdrs = adrsSevice.getAllAdrs();

        //Gera prazos para questionário Quantitativo - Primeira parte do mês
        for (int i = 1; i <= 12; i++) {
            String mes = "";
            if (i < 10) {
                mes += "0" + i;
            } else {
                mes += i;
            }
            String dataInicial = diaIniciolQuantitativo + "/" + mes + "/" + anoAtual;
            String dataFinal = diaFimQuantitativo + "/" + mes + "/" + anoAtual;
            Prazo prazo = new Prazo(UtilAdrs.treatToDate(dataInicial), UtilAdrs.treatToDate(dataFinal), false, true, false, listaAdrs);
            if (!prazoService.insertPrazo(prazo)) {
                request.getSession().setAttribute("erro", "Falha ao inserir prazo para questionário quantitativo.");
                return "/admin/admin_gerenciar_prazo.jsp";
            }
        }
        String diaInicioSanitario = "16";
        String diaFimSanitario = "31";

        //Gera prazos para questionário Sanitário - Segunda parte do mês
        for (int i = 1; i <= 12; i++) {
            String mes = "";
            if (i == 2) {
                diaFimSanitario = "28";
            } else if (i == 4 || i == 6 || i == 9 || i == 11) {
                diaFimSanitario = "30";
            } else {
                diaFimSanitario = "31";
            }
            if (i < 10) {
                mes += "0" + i;
            } else {
                mes = "" + i;
            }
            String dataInicial = diaInicioSanitario + "/" + mes + "/" + anoAtual;
            String dataFinal = diaFimSanitario + "/" + mes + "/" + anoAtual;
            Prazo prazo = new Prazo(UtilAdrs.treatToDate(dataInicial), UtilAdrs.treatToDate(dataFinal), false, false, true, listaAdrs);
            if (!prazoService.insertPrazo(prazo)) {
                request.getSession().setAttribute("erro", "Falha ao inserir prazo para questionário sanitário.");
                return "/admin/admin_gerenciar_prazo.jsp";
            }
        }
        //Recupera os prazos abertos pra colocá-los na sessão
        PrazoService ps = new PrazoService();
        List<Prazo> prazosAbertos = ps.getAllPrazos();
        SimpleDateFormat sdfAno = new SimpleDateFormat("MM/yyyy");

        //REMOVE PRAZOS DE OUTROS MESES
        for (int i = 0; i < prazosAbertos.size(); i++) {
            Prazo p = prazosAbertos.get(i);
            if (!sdfAno.format(dataAtual).equals(sdfAno.format(p.getFim()))) {
                prazosAbertos.remove(p);
                i--;
            }
        }
        //Remove prazos cumpridos
        ArrayList<Prazo> prazosAbertosTemp = new ArrayList<Prazo>(prazosAbertos);
        for (int i = 0; i < prazosAbertos.size(); i++) {
            Prazo prazo = prazosAbertos.get(i);
            List<Adrs> adrssDoPrazoTemp = UtilAdrs.filtrarAdrsAtrasadosNoPrazo(prazo);
            if (adrssDoPrazoTemp.isEmpty()) {
                removePrazoAberto(prazosAbertosTemp, prazo);
            } else {
                removePrazoAberto(prazosAbertosTemp, prazo);
                prazo.setListaAdrs(adrssDoPrazoTemp);
                prazosAbertosTemp.add(prazo);
            }
        }
        request.getSession().setAttribute("prazosAbertos", prazosAbertosTemp);
        request.getSession().setAttribute("sucesso", "Prazos gerados com sucesso.");
        return "/admin/admin_gerenciar_prazo.jsp";
    }

    private void removePrazoAberto(ArrayList<Prazo> prazos, Prazo prazo) {
        for (int i = 0; i < prazos.size(); i++) {
            if (prazos.get(i).getId().compareTo(prazo.getId()) == 0) {
                prazos.remove(i);
                break;
            }
        }
    }
}
